//interface（接⼝）
//interface 是⼀种定义结构的⽅式，主要作⽤是为：类、对象、函数等规定⼀种契约，这样
//可以确保代码的⼀致性和类型安全，但要注意 interface 只能定义格式，不能包含任何实现 ！

//定义类结构
interface PersonInterface {
    /**
     * name
     */
    name: string
    age: number
    speak(n: number): void
}

//继承实现接口,定义⼀个类 Person，实现 PersonInterface 接⼝
class Persion9 implements PersonInterface {
    //构造方法
    //实现PersonInterface中的属性
    constructor(public name: string, public age: number) {
    }

    //实现接⼝中的 speak ⽅法
    speak(n: number): void {
        for (let i = 0; i < n; i++) {
            // 打印出包含名字和年龄的问候语句
            console.log(`你好，我叫${this.name}，我的年龄是${this.age}`);
        }
    }
}

const per9 = new Persion9("zs", 18)
per9.speak(5)


//定义对象结构
interface UserInterface {
    name: string
    readonly gender: string //只读属性
    age?: number //可选属性
    run: (n: number) => void
}

const user: UserInterface = {
    name: '1233',
    age: 123,
    gender: "123",
    run: (n) => {
        console.log('奔跑了' + n)
    }
}
// user.gender = "132"
console.log(user.name, user.age, user.gender, user.run(5))

// class ABC implements UserInterface {
//     //构造方法
//     constructor(public name: string, public gender: string, public run: (n: number) => void) {

//     }
// }
// const abc = new ABC("123", "123", (a: number) => console.log("奔跑了多少" + a))
// console.log(abc.name, abc.gender, abc.run(12))


//定义函数结构
interface CountInterface {
    (a: number, b: number): number
}

const count2: CountInterface = (x: number, y: number) => x + y


//接⼝之间的继承
//⼀个 interface 继承另⼀个 interface ，从⽽实现代码的复⽤
interface PersonInterface2 {
    name: string // 姓名
    age: number // 年龄
}

interface StudentInterface2 extends PersonInterface2 {
    grade: string // 年纪
}

//定义对象结构
const stu4: StudentInterface2 = {
    name: "123",
    age: 18,
    grade: "123"
}

//实现接口
// class Student3 implements StudentInterface2 {
//     //构造方法
//     constructor(public name: string, public age: number, public grade: string) {

//     }
// }


//接⼝⾃动合并（可重复定义）
// PersonInterface接⼝
interface PersonInterface3 {
    // 属性声明
    name: string
    age: number
}
// 给PersonInterface接⼝添加新属性
interface PersonInterface3 {
    // ⽅法声明
    speak(): void
}

class Persion10 implements PersonInterface3 {
    //构造方法
    constructor(public name: string, public age: number) {

    }

    speak(): void {
        console.log("接口课和并性")
    }
}

// 总结：何时使⽤接⼝？
// 1. 定义对象的格式： 描述数据模型、API 响应格式、配置对象........等等，是开发中⽤的最多
//    的场景。
// 2. 类的契约：规定⼀个类需要实现哪些属性和⽅法。
// 3. 扩展已有接⼝：⼀般⽤于扩展第三⽅库的类型， 这种特性在⼤型项⽬中可能会⽤到。



